<?php

namespace app\admin\controller;

use app\admin\controller\AdminBase;
use app\admin\model\AchievementManage as ModelAchievementManage;
use app\admin\model\Page;
use app\common\model\AchievementModel;
use app\common\model\ExcelModel;
use app\common\model\UserModel;
use think\facade\View;

/**
 * 成果管理控制
 * 
 * 时间 ： 2020年3月13日13:27:05
 * 作者 ： 夏立军
 */
class AchievementManage extends AdminBase
{
    public function __construct()
    {
        parent::__construct();
        // 成果管理首页
        View::assign('index_home', url('AchievementManage/index'));
        // 成果分类首页
        View::assign('classify_home', url('AchievementManage/classify'));
        // 成果分类编辑页面
        View::assign('classify_edit', url('AchievementManage/classify_edit'));
    }

    // 成果管理首页入口
    public function index()
    {
        return view('index', []);
    }

    // 成果列表 ====================================================================================
    // 成果列表页面
    public function list()
    {
        return view('list', []);
    }

    // 成果分类 ====================================================================================

    // 成果分类页面
    public function classify()
    {
        $am = new ModelAchievementManage();
        $page = new Page();

        $am_count = $am->classify_all_count();
        $size = config('ams_config.classify_list_page_size');
        $page_res = $page->getPageRes($am_count, $size, url('classify'));

        $am_list = $am->classify_list($page_res['offset'], $page_res['size']);

        return view('classify', [
            // 分类列表
            'am_list' => $am_list,
            // 若分类无数据，则输出设置的样式
            'empty' => '<tr><td colspan="7" style="text-align: center;">没有数据</td></tr>',
            // 分页的处理结果
            'page_res' => $page_res,
        ]);
    }

    // 添加分类页面
    public function classify_add()
    {
        if (Request()->isPost()) {
            $am = new ModelAchievementManage();

            $aid = session('admin_login')->id;

            $name = input('post.name', null, 'string');
            $note = input('post.note', null, 'string');
            if (is_null($name) || is_null($note)) {
                return json(['code' => 1, 'msg' => '为传入指定参数']);
            }

            $am_add = $am->classify_add($aid, $name, $note, 0);
            if (!$am_add) {
                return json(['code' => 2, 'msg' => '添加失败,分类名重复']);
            }

            return json(['code' => 0, 'msg' => '添加成功']);
        }
        return view();
    }

    // 启用禁用分类
    public function classify_issue()
    {
        if (Request()->isPost()) {
            $am = new ModelAchievementManage();
            $id = input('post.id', null, 'intval');
            $issue = input('post.issue', null, 'intval');
            if (is_null($id) || is_null($issue)) {
                return json(['code' => 1, 'msg' => '为传入指定参数']);
            }
            $am_issue = $am->classify_issue($id, $issue);
            if (!$am_issue) {
                return json(['code' => 2, 'msg' => '状态修改失败']);
            }
            $msg = ($issue == 0) ? '禁用成功' : '启用成功';
            return json(['code' => 0, 'msg' => '[id: ' . $id . '] ' . $msg]);
        }

        return json(['code' => 3, 'msg' => '上传的数据的请求类型不是 post']);
    }

    // 清空分类数据
    public function classify_clear()
    {
        if (Request()->isPost()) {
            $am = new ModelAchievementManage();

            $cid = input('post.cid', null, 'intval');
            $text = input('post.text', null, 'string');
            if (is_null($cid) || is_null($text) || ($text != "立即清空")) {
                return json(['code' => 1, 'msg' => '未传入指定参数']);
            }

            $am_info = $am->classify_get_info($cid);
            if (2 == $am_info['flag']) {
                return json(['code' => 2, 'msg' => '清空失败,该分类已建立数据表']);
            }

            $del = $am->classify_clear($cid);
            if (!$del) {
                return json(['code' => 3, 'msg' => '清空失败，可能已被清除，请刷新或联系管理员']);
            }
            $am->classify_set_flag($cid, 0);
            return json(['code' => 0, 'msg' => '清空成功']);
        }
        return json(['code' => 4, 'msg' => '上传的数据的请求类型不是 post']);
    }

    // 删除分类
    public function classify_del()
    {
        if (Request()->isPost()) {
            $am = new ModelAchievementManage();

            $id = input('post.id', null, 'intval');
            $text = input('post.text', null, 'string');
            if (is_null($id) || is_null($text) || ($text != "立即删除")) {
                return json(['code' => 1, 'msg' => '未传入指定参数']);
            }

            $del = $am->classify_del($id);
            if (!$del) {
                return json(['code' => 2, 'msg' => '删除失败,该分类有数据']);
            }

            return json(['code' => 0, 'msg' => '删除成功']);
        }
        return json(['code' => 3, 'msg' => '上传的数据的请求类型不是 post']);
    }

    // 编辑分类
    public function classify_edit()
    {

        // 进行编辑操作
        if (Request()->isPost()) {
            $cid = input('post.id/d', '0');
            if ($cid == 0) {
                return json(['code' => 1, 'msg' => '分类ID不正确,返回分类页面重新进入']);
            }
            $table_name = input('post.table_name/s');

            // 表名不能为空
            if (empty($table_name)) {
                return json(['code' => 1, 'msg' => '表名不能为空']);
            }

            // 判断表名是否正确9
            if (!preg_match('/^[a-z]+?[a-z0-9_].*?$/', $table_name)) {
                return json(['code' => 2, 'msg' => '表名格式不正确']);
            }

            // 表名不能有空格
            if (strpos($table_name, ' ')) {
                return json(['code' => 3, 'msg' => '表名不能存在空格']);
            }

            $am = new ModelAchievementManage();
            $am_info = $am->classify_get_info($cid);
            if (0 != $am_info['flag'] && 1 != $am_info['flag']) {
                return json(['code' => 4, 'msg' => '该表已锁定不能进行保存操作']);
            }

            // 解析 前端 表格数据
            $table['cols'] = parse_string_to_array(input('post.cols'));
            $table['names'] = parse_string_to_array(input('post.names'));
            $table['notes'] = parse_string_to_array(input('post.notes'));
            $table['selects'] = parse_string_to_array(input('post.selects'));
            $table['lens'] = parse_string_to_array(input('post.lens'));
            // 转换为 JSON 数据，方便存储
            $table_content = json_encode($table, JSON_UNESCAPED_UNICODE);

            $check_res = self::classify_table_data_check($table);
            if ($check_res['status'] != '0') {
                return json(['code' => $check_res['status'], 'msg' => $check_res['msg']]);
            }
            $res = $am->classify_table_add($cid, $table_name, $table_content);
            if (!$res) {
                return json(['code' => 4, 'msg' => '保存失败,内容无变化']);
            }
            $am->classify_set_flag($cid, 1);
            return json(['code' => 0, 'msg' => '保存成功']);
        }

        $cid = input('get.id/d', null);
        if (is_null($cid)) {
            echo "<script>alert('分类ID不正确,返回分类页面重新进入');</script>";
            return redirect_test(url('AchievementManage/classify'));
        }
        $am = new ModelAchievementManage();
        // 获取需要的数据
        $res = $am->classify_table_info_by_cid($cid);
        // 分类的信息
        $classify_info = $am->classify_get_info($cid);

        $table_name = $res ? $res['table_name'] : 'classify_table_' . time();
        $table_content = $res ? $res['table_content'] : '';
        $table_status = $res ? $res['status'] : '-1';
        // 显示页面
        return view('classify_edit', [
            'id' => input('get.id', 0, 'intval'),
            'table_name' => $table_name,
            'table_content' => $table_content,
            'classify_type_list' => json_encode(config('ams_config.classify_type_list'), JSON_UNESCAPED_UNICODE),
            'separator' => config('ams_config.separator'),
            'classify_flag' => $classify_info['flag'],
            'table_status' => $table_status
        ]);
    }

    // 通过分类表的内容，创建一张具体的表
    public function classify_table_create()
    {
        if (Request()->isPost()) {
            $cid = input('post.cid/d', 0);
            if ($cid == 0) {
                return json(['code' => 1, 'msg' => '分类ID不正确,返回分类页面重新进入']);
            }
            $table_name = input('post.table_name/s');

            // 表名不能为空
            if (empty($table_name)) {
                return json(['code' => 1, 'msg' => '表名不能为空']);
            }

            // 判断表名是否正确9
            if (!preg_match('/^[a-z]+?[a-z0-9_].*?$/', $table_name)) {
                return json(['code' => 2, 'msg' => '表名格式不正确']);
            }

            // 表名不能有空格
            if (strpos($table_name, ' ')) {
                return json(['code' => 3, 'msg' => '表名不能存在空格']);
            }


            $am = new ModelAchievementManage();
            $res = $am->classify_table_create($cid, $table_name);

            if (!$res)
                return json(['code' => 4, 'msg' => '表名冲突，请确认或重新保存数据']);

            $am->classify_set_flag($cid, 2);
            return json(['code' => 0, 'msg' => '创建成功']);
        }
    }

    // 清除收集表的数据
    public function classify_table_others_clear()
    {
        if (Request()->isPost()) {
            $cid = input('post.cid', null, 'intval');
            $text = input('post.text', null, 'string');
            if (is_null($cid) || is_null($text) || ($text != "立即清空")) {
                return json(['code' => 1, 'msg' => '未传入指定参数']);
            }

            $am = new ModelAchievementManage();
            $am_res = $am->classify_table_others_clear($cid);
            if (!$am_res) {
                return json(['code' => 1, 'msg' => '清空失败，未找到表信息']);
            }
            return json(['code' => 0, 'msg' => '清空成功']);
        }
        return json(['code' => 99, 'msg' => '上传的数据的请求类型不是 post']);
    }

    // 删除收集表
    public function classify_table_others_drop()
    {
        if (Request()->isPost()) {
            $cid = input('post.cid', null, 'intval');
            $text = input('post.text', null, 'string');
            if (is_null($cid) || is_null($text) || ($text != "立即删除")) {
                return json(['code' => 1, 'msg' => '未传入指定参数']);
            }

            $am = new ModelAchievementManage();

            $am_info = $am->classify_table_info_by_cid($cid);

            if (!$am_info) {
                return json(['code' => 2, 'msg' => '删除失败，数据表不存在']);
            }

            $classify_table_one_data = $am->get_classify_table_one_data($am_info['table_name']);
            // return json($classify_table_one_data);
            if ($classify_table_one_data) {
                return json(['code' => 3, 'msg' => '删除失败，数据表内有数据']);
            }

            $am_res = $am->classify_table_others_drop($cid);
            if (!$am_res) {
                return json(['code' => 4, 'msg' => '删除失败，未找到表信息']);
            }
            $am->classify_set_flag($cid, 1);
            return json(['code' => 0, 'msg' => '删除成功']);
        }
        return json(['code' => 99, 'msg' => '上传的数据的请求类型不是 post']);
    }

    // 创建模板
    public function create_template()
    {
        $cid = input('post.cid/d', null);
        if (!$cid) {
            return json(['code' => 1, 'msg' => '分类ID丢失']);
        }
        $am = new ModelAchievementManage();

        // 获取中间表的数据
        $classify_table_info = $am->classify_table_info_by_cid($cid);
        $classify_table_info['table_content'] = json_decode($classify_table_info['table_content'], true);

        // 获取分类表的数据
        $classify_info = $am->classify_get_info($cid);

        $phpoffice = new ExcelModel();
        $phpoffice_res = $phpoffice->create_template($classify_table_info['table_content'], $classify_info['name']);
        if (!$phpoffice_res) {
            return json(['code' => 2, 'msg' => '创建失败']);
        }
        // 修改创建生成表的状态信息
        $res = $am->set_classify_table_data_by_cid($cid, ['status' => 1, 'create_time' => time()]);
        if (!$res) {
            return json(['code' => 3, 'msg' => '创建异常']);
        }

        return json(['code' => 0, 'msg' => '创建完成']);
    }

    // 删除模板
    public function del_template()
    {
        $cid = input('post.cid/d', null);
        if (!$cid) {
            return json(['code' => 1, 'msg' => '分类ID丢失']);
        }
        // 实例化一个成果管理器
        $am = new ModelAchievementManage();
        // 获取一条成果分类的数据
        $classify_info = $am->classify_get_info($cid);

        // 实例化一个excel表格的实例
        $excel = new ExcelModel();
        // 删除一个指定的文件
        $del_res = $excel->delFile($classify_info['name']);

        if ($del_res['code'] != 0) {
            return json(['code' => 0, 'msg' => '删除失败']);
        }

        $am->set_classify_table_data_by_cid($cid, ['status' => 0]);
        return json(['code' => 0, 'msg' => '删除完成']);
    }


    /**
     * 检查分类表的内容，是否完整
     * @param $table 要检查的表的内容数据
     * @return 是否通过，返回错误位置
     */
    private function classify_table_data_check($table)
    {
        foreach ($table['cols'] as $row) {
            if (empty($row))
                return ['status' => '1', 'msg' => '字段不能为空'];
            if (is_null($row))
                return ['status' => '2', 'msg' => '字段不能为空'];
            if (strpos($row, ' '))
                return ['status' => '3', 'msg' => '字段内有空格: [' . $row . ']'];
            if ($row == 'null')
                return ['status' => '4', 'msg' => '字段不能为null'];
        }

        foreach ($table['names'] as $row) {
            if (empty($row))
                return ['status' => '1', 'msg' => '提示名不能为空'];
            if (is_null($row))
                return ['status' => '2', 'msg' => '提示名不能为空'];
            if ($row == 'null')
                return ['status' => '3', 'msg' => '提示名不能为null'];
        }

        foreach ($table['selects'] as $row) {
            $row_flag = true;
            foreach (config('ams_config.classify_type_list') as $row2) {
                if ($row == $row2['value']) {
                    $row_flag = false;
                    break;
                }
            }
            if ($row_flag) {
                return ['status' => '1', 'msg' => '字段类型不存在'];
            }
        }

        foreach ($table['lens'] as $row) {
            if (strpos($row, '.')) {
                return ['status' => '1', 'msg' => '字段长度，必须是整型数值'];
            }
        }

        return ['status' => '0', 'msg' => '结果正常'];
    }

    // 成果分析 ====================================================================================
    // 成果分析页面
    public function analyze()
    {
        return view('analyze', []);
    }


    // 成果下载 ====================================================================================
    // 成果下载页面
    public function download()
    {
        // 获取所有的成果分类
        $achievementManage = new ModelAchievementManage();
        $classify_all_data = $achievementManage->classify_all_data();

        // 获取所有的用户
        $user = new UserModel();
        $user_data =  $user->get_user_all_data();


        return view('download', [
            'classify_all_data' => $classify_all_data,
            'user_data' => $user_data
        ]);
    }

    //成果下载
    public function download_achievement()
    {
        $cid = input('post.cid/d', null);
        if (is_null($cid)) {
            return json(['code' => 1, 'msg' => '参数丢失']);
        }

        $uid = input('post.uid/d', null);

        // 根据状态下载所需要的的信息
        /**
         * -1 下载全部
         * 0  下载已通过
         * 1  自定义下载
         */
        $status = input('post.status/d', null);

        $excel = new ExcelModel();
        $achievement = new AchievementModel();
        // 获取分类数据
        $classify_info = $achievement->get_classify_info_by_id($cid);
        // 需要保存的文件名
        $file_name = $classify_info['name'];
        // 表名 表内列的内容
        $achievement_classify_table_info = $achievement->get_achievement_classify_table_info_by_cid($cid);
        $table_name = $achievement_classify_table_info['table_name'];
        $table_content = $achievement_classify_table_info['table_content'];
        // 表格配置
        $excel_template_config =  config('ams_config.excel_template');

        // 第一种模式  全部下载
        if ($status == -1) {
            // 查询成果收集表中的所有数据
            if ($uid == -1) {
                $achievement_classify_table_other_info = $achievement->get_achievement_classify_table_other_all_info_by_tableName($table_name);
            } else {
                $achievement_classify_table_other_info = $achievement->get_achievement_classify_table_other_info_by_tableName_and_uid($table_name, $uid);
            }
            if (!$achievement_classify_table_other_info) {
                return json(['code' => 2, 'msg' => '该分类没有数据']);
            }

            $data = $achievement_classify_table_other_info->toArray();
        }
        // 第二种模式  已通过
        else if ($status == 0) {
            // 查询成果收集表中的已通过数据
            if ($uid == -1) {
                $achievement_classify_table_other_info = $achievement->get_achievement_classify_table_other_info_by_tableName_and_status($table_name, 4);
            } else {
                $achievement_classify_table_other_info = $achievement->get_achievement_classify_table_other_info_by_tableName_and_uid_and_status($table_name, $uid, 4);
            }
            if (is_null($achievement_classify_table_other_info)) {
                return json(['code' => 2, 'msg' => '该分类没有数据']);
            }
            $data = $achievement_classify_table_other_info->toArray();
        }
        // 第二种模式  自定义模式
        else if ($status == 1) {
            // 1 自定义下载的对应ID组
            $ids = input('post.ids/s', null);
            if (!$ids) {
                return json(['code' => 2, 'msg' => '请至少选择一条数据']);
            }

            $ids = explode(",", $ids);
            if ($uid == -1) {
                $achievement_classify_table_other_info = $achievement->get_achievement_classify_table_other_all_info_by_tableName($table_name);
            } else {
                // 获取所有的数据
                $achievement_classify_table_other_info = $achievement->get_achievement_classify_table_other_info_by_tableName_and_uid($table_name, $uid);
            }

            $data = [];
            foreach ($ids as $row_id) {
                foreach ($achievement_classify_table_other_info as $row) {
                    if ($row['id'] == $row_id) {
                        $data[] = $row;
                        break;
                    }
                }
            }
        }

        // 验证是否有数据
        if (!$achievement_classify_table_other_info || count($achievement_classify_table_other_info) <= 0) {
            return json(['code' => 2, 'msg' => '当前成果没有数据，无法下载']);
        }
        // 生成导出文件
        $res = $excel->excel_import($uid, $file_name, $table_content, $data);

        if ($res['code'] != 0) {
            return json(['code' => 3, 'msg' => $res['msg']]);
        }
        // 获取下载地址
        $download_url = $excel_template_config['import_path_download'] . '/' . $res['msg'];

        if (!is_file(config('ams_config.app_path') . '/public' . $download_url)) {
            return json(['code' => 4, 'msg' => '成果数据表格创建失败，请联系管理员']);
        }

        return json(['code' => 0, 'msg' => '开始下载', 'url' => $download_url]);
    }

    // 自定义下载页面
    public function custom()
    {
        // 获取前端信息
        $cid = input('get.cid', null);
        $uid = input('get.uid', null);

        // var_dump($_GET);
        // die;

        if (is_null($cid) || $cid == "") {
            return redirect_index('分类ID不存在', url('download'));
        }

        // 获取已启用的分类的成果分类
        $achievementManage = new ModelAchievementManage();
        // 获取所有的用户
        $user = new UserModel();

        $classify_table_info = $achievementManage->classify_table_info_by_cid($cid);

        $table_name = $classify_table_info['table_name'];
        $table_content = json_decode($classify_table_info['table_content'], true);

        if (is_null($uid) || $uid == "-1") {
            $classify_table_other_info = $achievementManage->get_classify_table_other_info_by_tableName($table_name);
        } else {
            $classify_table_other_info = $achievementManage->get_classify_table_other_info_by_tableName_and_uid($table_name, $uid);
        }

        // var_dump($classify_table_other_info);
        // die;

        // 分类中间表的数值类型
        $classify_type_list =  config('ams_config.classify_type_list');

        return view('custom', [
            'classify_table_other_info' => $classify_table_other_info,
            'classify_type_list' => $classify_type_list,
            'table_content' => $table_content,
            // 'user_data' => $user_data,
            'cid' => $cid,
            'uid' => $uid,
        ]);
    }
}
